2. Deactivate Component 중복 호출에서 발생한 버그
그림에서 알 수 있듯, ActorComponent의 OnDeactivate()가 두번 호출되면서, 틱 그룹에서 컴포넌트를 제거하는데 실패해서 크래시가 발생함.
void WWorld::DequeueComponentTick(WActorComponent* ActorComp)
{
if (!ActorComp || ActorComp->mTickGroup == ETickGroup::ETG_None || ActorComp->mTickQueueId < 0)
{
return;
}
int i = ActorComp->mTickQueueId;
ActorComp->mTickQueueId = -1;
std::vector<WActorComponent*>& TickGroup = mActorComponentTickGroups[ActorComp->mTickGroup];
if (i < TickGroup.size() - 1)
{
TickGroup[i] = std::move(TickGroup.back());
TickGroup[i]->mTickQueueId = i;
}
TickGroup.pop_back();
}
문제의 코드인데, 주석을 달아놓은 것 처럼 위 if문에서 mTickQueueId를 비교하지만, 정작 제거할때 Id를 변경하는 것을 깜박해서 두번째 제거시도에서 OutOfBound 버그가 발생한 것이였음. 해당 라인을 추가해 주니 정상적으로 작동함.